gesture: Simplify gesture/widget interaction public API
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 6 May 2014 13:50:01 +0000 (15:50 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Fri, 23 May 2014 17:54:29 +0000 (19:54 +0200)
The propagation phase property/methods in GtkEventController are gone,
This is now set directly on the GtkWidget add/remove controller API,
which has been made private.

The only public bit now are the new functions gtk_gesture_attach() and
gtk_gesture_detach() that will use the private API underneath.

All callers have been updated.

19 files changed:
demos/gtk-demo/gestures.c
docs/reference/gtk/gtk3-sections.txt
gtk/gtkbutton.c
gtk/gtkcolorplane.c
gtk/gtkcolorscale.c
gtk/gtkcolorswatch.c
gtk/gtkdnd.c
gtk/gtkeventcontroller.c
gtk/gtkeventcontroller.h
gtk/gtkgesture.c
gtk/gtkgesture.h
gtk/gtkrange.c
gtk/gtkscrolledwindow.c
gtk/gtkspinbutton.c
gtk/gtktreeview.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index 387e357b6c0d204d868454888d404271bbdf40e8..dd27cdb4a6ff58c0982539bd67c098d5f1c7bedb 100644 (file)
@@ -156,7 +156,7 @@ do_gestures (GtkWidget *do_widget)
       gesture = gtk_gesture_swipe_new (drawing_area);
       g_signal_connect (gesture, "swipe",
                         G_CALLBACK (swipe_gesture_swept), drawing_area);
-      gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (gesture));
+      gtk_gesture_attach (gesture, GTK_PHASE_BUBBLE);
       g_object_unref (gesture);
 
       /* Long press */
@@ -165,21 +165,21 @@ do_gestures (GtkWidget *do_widget)
                         G_CALLBACK (long_press_gesture_pressed), drawing_area);
       g_signal_connect (gesture, "end",
                         G_CALLBACK (long_press_gesture_end), drawing_area);
-      gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (gesture));
+      gtk_gesture_attach (gesture, GTK_PHASE_BUBBLE);
       g_object_unref (gesture);
 
       /* Rotate */
       rotate = gesture = gtk_gesture_rotate_new (drawing_area);
       g_signal_connect (gesture, "angle-changed",
                         G_CALLBACK (rotation_angle_changed), drawing_area);
-      gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (gesture));
+      gtk_gesture_attach (gesture, GTK_PHASE_BUBBLE);
       g_object_unref (gesture);
 
       /* Zoom */
       zoom = gesture = gtk_gesture_zoom_new (drawing_area);
       g_signal_connect (gesture, "scale-changed",
                         G_CALLBACK (zoom_scale_changed), drawing_area);
-      gtk_widget_add_controller (drawing_area, GTK_EVENT_CONTROLLER (gesture));
+      gtk_gesture_attach (gesture, GTK_PHASE_BUBBLE);
       g_object_unref (gesture);
     }
 
index fb9a599a3ec52d9301c5b180a5ad94d283e0e11c..51729188d9517c5b11123bd852ae9a1e2b59d3fe 100644 (file)
@@ -5583,11 +5583,6 @@ gtk_widget_class_bind_template_callback
 gtk_widget_class_bind_template_callback_full
 gtk_widget_class_set_connect_func
 
-<SUBSECTION Gestures>
-gtk_widget_add_controller
-gtk_widget_remove_controller
-gtk_widget_list_controllers
-
 <SUBSECTION Standard>
 GTK_WIDGET
 GTK_IS_WIDGET
@@ -7902,9 +7897,6 @@ gtk_popover_get_modal
 <TITLE>GtkEventController</TITLE>
 GtkEventController
 gtk_event_controller_handle_event
-GtkPropagationPhase
-gtk_event_controller_get_propagation_phase
-gtk_event_controller_set_propagation_phase
 gtk_event_controller_get_event_mask
 gtk_event_controller_set_event_mask
 gtk_event_controller_get_widget
@@ -7939,6 +7931,9 @@ gtk_gesture_set_state
 gtk_gesture_cancel_sequence
 gtk_gesture_get_sequences
 gtk_gesture_handles_sequence
+GtkPropagationPhase
+gtk_gesture_attach
+gtk_gesture_detach
 
 <SUBSECTION>
 gtk_gesture_get_last_updated_sequence
index 41db02427a1947120ee42bbf0d6a177f7bff3663..f355372769d8714e36ad18ee99284ccb1f75b8cf 100644 (file)
@@ -648,7 +648,7 @@ gtk_button_init (GtkButton *button)
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->gesture), GDK_BUTTON_PRIMARY);
   g_signal_connect (priv->gesture, "begin", G_CALLBACK (gesture_begin_cb), button);
   g_signal_connect (priv->gesture, "end", G_CALLBACK (gesture_end_cb), button);
-  gtk_widget_add_controller (GTK_WIDGET (button), GTK_EVENT_CONTROLLER (priv->gesture));
+  gtk_gesture_attach (priv->gesture, GTK_PHASE_BUBBLE);
 }
 
 static void
@@ -665,7 +665,7 @@ gtk_button_destroy (GtkWidget *widget)
 
   if (priv->gesture)
     {
-      gtk_widget_remove_controller (widget, GTK_EVENT_CONTROLLER (priv->gesture));
+      gtk_gesture_detach (priv->gesture);
       g_object_unref (priv->gesture);
       priv->gesture = NULL;
     }
index 9a81af1df084351e27a31ea0f0633fd3cc8148bb..26467e9b87f614ccd04057576e00958bbc1deb2a 100644 (file)
@@ -427,7 +427,7 @@ gtk_color_plane_init (GtkColorPlane *plane)
   plane->priv->long_press_gesture = gtk_gesture_long_press_new (GTK_WIDGET (plane));
   g_signal_connect (plane->priv->long_press_gesture, "pressed",
                     G_CALLBACK (hold_action), plane);
-  gtk_widget_add_controller (GTK_WIDGET (plane), GTK_EVENT_CONTROLLER (plane->priv->long_press_gesture));
+  gtk_gesture_attach (plane->priv->long_press_gesture, GTK_PHASE_BUBBLE);
 }
 
 static void
@@ -442,7 +442,7 @@ plane_finalize (GObject *object)
   g_clear_object (&plane->priv->s_adj);
   g_clear_object (&plane->priv->v_adj);
 
-  gtk_widget_remove_controller (GTK_WIDGET (object), GTK_EVENT_CONTROLLER (plane->priv->long_press_gesture));
+  gtk_gesture_detach (plane->priv->long_press_gesture);
   g_clear_object (&plane->priv->long_press_gesture);
 
   G_OBJECT_CLASS (gtk_color_plane_parent_class)->finalize (object);
index 7622bd1d2841f37e93efc95511c13b97d60c8b6d..0331b04318e3010c273e5c585e5fcfd08384f63d 100644 (file)
@@ -258,8 +258,7 @@ gtk_color_scale_init (GtkColorScale *scale)
   scale->priv->long_press_gesture = gtk_gesture_long_press_new (GTK_WIDGET (scale));
   g_signal_connect (scale->priv->long_press_gesture, "pressed",
                     G_CALLBACK (hold_action), scale);
-  gtk_widget_add_controller (GTK_WIDGET (scale),
-                             GTK_EVENT_CONTROLLER (scale->priv->long_press_gesture));
+  gtk_gesture_attach (scale->priv->long_press_gesture, GTK_PHASE_BUBBLE);
 }
 
 static void
@@ -270,8 +269,7 @@ scale_finalize (GObject *object)
   if (scale->priv->surface)
     cairo_surface_destroy (scale->priv->surface);
 
-  gtk_widget_remove_controller (GTK_WIDGET (object),
-                                GTK_EVENT_CONTROLLER (scale->priv->long_press_gesture));
+  gtk_gesture_detach (scale->priv->long_press_gesture);
   g_clear_object (&scale->priv->long_press_gesture);
 
   G_OBJECT_CLASS (gtk_color_scale_parent_class)->finalize (object);
index ed61f85dfe6fa66c0a0d65446e5bee9ec69a7690..23c167c2b1717d167ffbacda58b2e8a0a75876f5 100644 (file)
@@ -90,14 +90,12 @@ gtk_color_swatch_init (GtkColorSwatch *swatch)
   swatch->priv->long_press_gesture = gtk_gesture_long_press_new (GTK_WIDGET (swatch));
   g_signal_connect (swatch->priv->long_press_gesture, "pressed",
                     G_CALLBACK (hold_action), swatch);
-  gtk_widget_add_controller (GTK_WIDGET (swatch),
-                             GTK_EVENT_CONTROLLER (swatch->priv->long_press_gesture));
+  gtk_gesture_attach (swatch->priv->long_press_gesture, GTK_PHASE_BUBBLE);
 
   swatch->priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (swatch));
   g_signal_connect (swatch->priv->multipress_gesture, "pressed",
                     G_CALLBACK (tap_action), swatch);
-  gtk_widget_add_controller (GTK_WIDGET (swatch),
-                             GTK_EVENT_CONTROLLER (swatch->priv->multipress_gesture));
+  gtk_gesture_attach (swatch->priv->multipress_gesture, GTK_PHASE_BUBBLE);
 }
 
 #define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11)
@@ -721,12 +719,10 @@ swatch_finalize (GObject *object)
 
   g_free (swatch->priv->icon);
 
-  gtk_widget_remove_controller (GTK_WIDGET (object),
-                                GTK_EVENT_CONTROLLER (swatch->priv->long_press_gesture));
+  gtk_gesture_detach (swatch->priv->long_press_gesture);
   g_object_unref (swatch->priv->long_press_gesture);
 
-  gtk_widget_remove_controller (GTK_WIDGET (object),
-                                GTK_EVENT_CONTROLLER (swatch->priv->multipress_gesture));
+  gtk_gesture_detach (swatch->priv->multipress_gesture);
   g_object_unref (swatch->priv->multipress_gesture);
 
   G_OBJECT_CLASS (gtk_color_swatch_parent_class)->finalize (object);
index a375e219f2d97c85ed6be0bc4ebb86e84c16bbea..f9452eda96b88cc10c91212895aaf9e8df3c2db1 100644 (file)
@@ -2801,9 +2801,7 @@ gtk_drag_source_set (GtkWidget            *widget,
       site->drag_gesture = gtk_gesture_drag_new (widget);
       gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (site->drag_gesture),
                                          FALSE);
-      gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (site->drag_gesture),
-                                                  GTK_PHASE_NONE);
-      gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (site->drag_gesture));
+      gtk_gesture_attach (site->drag_gesture, GTK_PHASE_NONE);
 
       g_signal_connect (widget, "button-press-event",
                        G_CALLBACK (gtk_drag_source_event_cb),
@@ -2846,8 +2844,7 @@ gtk_drag_source_unset (GtkWidget *widget)
       g_signal_handlers_disconnect_by_func (widget,
                                             gtk_drag_source_event_cb,
                                             site);
-      gtk_widget_remove_controller (widget,
-                                    GTK_EVENT_CONTROLLER (site->drag_gesture));
+      gtk_gesture_detach (site->drag_gesture);
       g_object_set_data (G_OBJECT (widget), I_("gtk-site-data"), NULL);
     }
 }
index a3dd64967b9b041dbe3ac4077e6757154e86a374..a505512bced3d4796f2e9a1b18ab2307fd1216e4 100644 (file)
  * #GtkEventController is a base, low-level implementation for event
  * controllers. Those react to a series of #GdkEvents, and possibly trigger
  * actions as a consequence of those.
- *
- * Most usually, event controllers are attached to a widget through
- * gtk_widget_add_controller(). This ensures events received by the
- * widget are delivered to the controller. On special situations,
- * manual delivery may be desired, this can be achieved by setting
- * the capture phase to %GTK_PHASE_NONE and feeding events manually
- * through gtk_event_controller_handle_event(). See
- * gtk_event_controller_set_propagation_phase() and #GtkPropagationPhase
- * to know more about how events are delivered to event controllers.
  */
 
 #include "config.h"
@@ -50,8 +41,7 @@ typedef struct _GtkEventControllerPrivate GtkEventControllerPrivate;
 
 enum {
   PROP_WIDGET = 1,
-  PROP_EVENT_MASK,
-  PROP_PROPAGATION_PHASE
+  PROP_EVENT_MASK
 };
 
 enum {
@@ -64,7 +54,6 @@ struct _GtkEventControllerPrivate
 {
   GtkWidget *widget;
   guint evmask;
-  guint propagation_phase : 2;
 };
 
 guint signals[N_SIGNALS] = { 0 };
@@ -164,22 +153,6 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
                                                        P_("Event mask the controller handles"),
                                                        GDK_TYPE_EVENT_MASK, 0,
                                                        GTK_PARAM_READWRITE));
-  /**
-   * GtkEventController:propagation-phase:
-   *
-   * Specifies the stage in event propagation at which events are handled by the
-   * controller. Note that this requires a controller to be attached through
-   * gtk_widget_add_controller().
-   *
-   * Since: 3.14
-   */
-  g_object_class_install_property (object_class,
-                                   PROP_PROPAGATION_PHASE,
-                                   g_param_spec_enum ("propagation-phase",
-                                                      P_("Propagation phase"),
-                                                      P_("Phase in event propagation where this controller handles events"),
-                                                      GTK_TYPE_PROPAGATION_PHASE, GTK_PHASE_BUBBLE,
-                                                      GTK_PARAM_READWRITE));
   /**
    * GtkEventController::handle-event:
    * @controller: the object which receives the signal
@@ -221,10 +194,6 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
 static void
 gtk_event_controller_init (GtkEventController *controller)
 {
-  GtkEventControllerPrivate *priv;
-
-  priv = gtk_event_controller_get_instance_private (controller);
-  priv->propagation_phase = GTK_PHASE_BUBBLE;
 }
 
 /**
@@ -343,53 +312,3 @@ gtk_event_controller_reset (GtkEventController *controller)
 
   g_signal_emit (controller, signals[RESET], 0);
 }
-
-/**
- * gtk_event_controller_get_propagation_phase:
- * @controller: a #GtkEventController
- *
- * Gets the propagation phase at which this @controller is run.
- *
- * Returns: The propagation phase
- *
- * Since: 3.14
- **/
-GtkPropagationPhase
-gtk_event_controller_get_propagation_phase (GtkEventController *controller)
-{
-  GtkEventControllerPrivate *priv;
-
-  g_return_val_if_fail (GTK_IS_EVENT_CONTROLLER (controller), GTK_PHASE_NONE);
-
-  priv = gtk_event_controller_get_instance_private (controller);
-
-  return priv->propagation_phase;
-}
-
-/**
- * gtk_event_controller_set_propagation_phase:
- * @controller: a #GtkEventController
- * @phase: the propagation phase
- *
- * Sets the propagation phase at which this @controller is run. Note that
- * event controllers are run before the regular #GtkWidget::event handler.
- *
- * Since: 3.14
- **/
-void
-gtk_event_controller_set_propagation_phase (GtkEventController  *controller,
-                                            GtkPropagationPhase  phase)
-{
-  GtkEventControllerPrivate *priv;
-
-  g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
-  g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_CAPTURE);
-
-  priv = gtk_event_controller_get_instance_private (controller);
-
-  if (priv->propagation_phase == phase)
-    return;
-
-  priv->propagation_phase = phase;
-  g_object_notify (G_OBJECT (controller), "propagation-phase");
-}
index db1fa57ca5bba23ecb937f6d9a56748d17d1737f..9bf0531911fa2f016fa79ec6e3b984771834652b 100644 (file)
@@ -59,14 +59,6 @@ gboolean     gtk_event_controller_handle_event   (GtkEventController *controller
 GDK_AVAILABLE_IN_3_14
 void         gtk_event_controller_reset          (GtkEventController *controller);
 
-GDK_AVAILABLE_IN_3_14
-GtkPropagationPhase
-             gtk_event_controller_get_propagation_phase (GtkEventController *controller);
-
-GDK_AVAILABLE_IN_3_14
-void         gtk_event_controller_set_propagation_phase (GtkEventController  *controller,
-                                                         GtkPropagationPhase  phase);
-
 G_END_DECLS
 
 #endif /* __GTK_EVENT_CONTROLLER_H__ */
index fd72f20161c5e9db6de6042ac7857c0591a0020a..28a07c6206b6f0ee47984a0dab3e7ce4b4946ae1 100644 (file)
@@ -88,6 +88,7 @@
 
 #include "config.h"
 #include "gtkgesture.h"
+#include "gtkwidgetprivate.h"
 #include "gtkgestureprivate.h"
 #include "gtktypebuiltins.h"
 #include "gtkprivate.h"
@@ -1557,3 +1558,51 @@ _gtk_gesture_get_pointer_emulating_sequence (GtkGesture        *gesture,
 
   return FALSE;
 }
+
+/**
+ * gtk_gesture_attach:
+ * @gesture: a #GtkGesture
+ * @phase: phase at which events are handled
+ *
+ * Attaches @gesture to its widget, so @gesture is able to receive
+ * and manage the events that are emitted on the #GtkWidget. This call
+ * will also make sure that the gesture state is maintained properly
+ * whenever input is grabbed elsewhere.
+ *
+ * If @phase is %GTK_PHASE_NONE, no automatical event handling will be
+ * performed, but other additional gesture maintenance will. The events
+ * can be managed by calling gtk_event_controller_handle_event().
+ *
+ * Since: 3.14
+ **/
+void
+gtk_gesture_attach (GtkGesture          *gesture,
+                    GtkPropagationPhase  phase)
+{
+  GtkWidget *widget;
+
+  g_return_if_fail (GTK_IS_GESTURE (gesture));
+  g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_BUBBLE);
+
+  widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+  _gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (gesture), phase);
+}
+
+/**
+ * gtk_gesture_detach:
+ * @gesture: a #GtkGesture
+ *
+ * Detaches @gesture from its widget.
+ *
+ * Since: 3.14
+ **/
+void
+gtk_gesture_detach (GtkGesture *gesture)
+{
+  GtkWidget *widget;
+
+  g_return_if_fail (GTK_IS_GESTURE (gesture));
+
+  widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+  _gtk_widget_remove_controller (widget, GTK_EVENT_CONTROLLER (gesture));
+}
index a478a4582601efcfa2e60a668d7303e56e9b4a51..c90b8f1f1a05529cbd7f76995702fb57acdba88f 100644 (file)
@@ -120,6 +120,12 @@ GDK_AVAILABLE_IN_3_14
 gboolean    gtk_gesture_is_grouped_with      (GtkGesture       *gesture,
                                               GtkGesture       *other);
 
+GDK_AVAILABLE_IN_3_14
+void        gtk_gesture_attach               (GtkGesture          *gesture,
+                                              GtkPropagationPhase  phase);
+GDK_AVAILABLE_IN_3_14
+void        gtk_gesture_detach               (GtkGesture          *gesture);
+
 G_END_DECLS
 
 #endif /* __GTK_GESTURE_H__ */
index 5961a39f4084ae3579c84a4d4664c423f8d00cd2..b8ab861d8cc640240e1bf448908517d1aa753205 100644 (file)
@@ -1507,7 +1507,7 @@ gtk_range_destroy (GtkWidget *widget)
 
   if (priv->long_press_gesture)
     {
-      gtk_widget_remove_controller (widget, GTK_EVENT_CONTROLLER (priv->long_press_gesture));
+      gtk_gesture_detach (priv->long_press_gesture);
       g_clear_object (&priv->long_press_gesture);
     }
 
@@ -2369,8 +2369,7 @@ update_zoom_set (GtkRange *range,
 {
   if (zoom_set)
     {
-      gtk_widget_remove_controller (GTK_WIDGET (range),
-                                    GTK_EVENT_CONTROLLER (range->priv->long_press_gesture));
+      gtk_gesture_detach (range->priv->long_press_gesture);
       g_clear_object (&range->priv->long_press_gesture);
     }
 
@@ -2712,8 +2711,7 @@ gtk_range_button_press (GtkWidget      *widget,
                   gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (priv->long_press_gesture),
                                                      FALSE);
                   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->long_press_gesture), 1);
-                  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->long_press_gesture),
-                                                              GTK_PHASE_NONE);
+                  gtk_gesture_attach (priv->long_press_gesture, GTK_PHASE_NONE);
 
                   g_signal_connect (priv->long_press_gesture, "pressed",
                                     G_CALLBACK (hold_action), range);
index 01d5f526195d98952cb7986c58180f08c567b968..65061d4ffc37bc404930c3be9283db45a4cbfd17 100644 (file)
@@ -745,8 +745,6 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
 
   priv->drag_gesture = gtk_gesture_drag_new (widget);
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->drag_gesture), 1);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->drag_gesture),
-                                              GTK_PHASE_CAPTURE);
   g_signal_connect_swapped (priv->drag_gesture, "drag-begin",
                             G_CALLBACK (scrolled_window_drag_begin_cb),
                             scrolled_window);
@@ -760,16 +758,12 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
   priv->swipe_gesture = gtk_gesture_swipe_new (widget);
   gtk_gesture_group (priv->swipe_gesture, priv->drag_gesture);
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->swipe_gesture), 1);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->swipe_gesture),
-                                              GTK_PHASE_CAPTURE);
   g_signal_connect_swapped (priv->swipe_gesture, "swipe",
                             G_CALLBACK (scrolled_window_swipe_cb),
                             scrolled_window);
   priv->long_press_gesture = gtk_gesture_long_press_new (widget);
   gtk_gesture_group (priv->long_press_gesture, priv->drag_gesture);
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->long_press_gesture), 1);
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->long_press_gesture),
-                                              GTK_PHASE_CAPTURE);
   g_signal_connect_swapped (priv->long_press_gesture, "pressed",
                             G_CALLBACK (scrolled_window_long_press_cb),
                             scrolled_window);
@@ -1253,21 +1247,15 @@ gtk_scrolled_window_set_kinetic_scrolling (GtkScrolledWindow *scrolled_window,
 
   if (priv->kinetic_scrolling)
     {
-      gtk_widget_add_controller (GTK_WIDGET (scrolled_window),
-                                 GTK_EVENT_CONTROLLER (priv->drag_gesture));
-      gtk_widget_add_controller (GTK_WIDGET (scrolled_window),
-                                 GTK_EVENT_CONTROLLER (priv->swipe_gesture));
-      gtk_widget_add_controller (GTK_WIDGET (scrolled_window),
-                                 GTK_EVENT_CONTROLLER (priv->long_press_gesture));
+      gtk_gesture_attach (priv->drag_gesture, GTK_PHASE_CAPTURE);
+      gtk_gesture_attach (priv->swipe_gesture, GTK_PHASE_CAPTURE);
+      gtk_gesture_attach (priv->long_press_gesture, GTK_PHASE_CAPTURE);
     }
   else
     {
-      gtk_widget_remove_controller (GTK_WIDGET (scrolled_window),
-                                    GTK_EVENT_CONTROLLER (priv->drag_gesture));
-      gtk_widget_remove_controller (GTK_WIDGET (scrolled_window),
-                                    GTK_EVENT_CONTROLLER (priv->swipe_gesture));
-      gtk_widget_remove_controller (GTK_WIDGET (scrolled_window),
-                                    GTK_EVENT_CONTROLLER (priv->long_press_gesture));
+      gtk_gesture_detach (priv->drag_gesture);
+      gtk_gesture_detach (priv->swipe_gesture);
+      gtk_gesture_detach (priv->long_press_gesture);
 
       gtk_scrolled_window_cancel_deceleration (scrolled_window);
     }
index fb0c40b3578b43a333ec61b21c09b16ca4d24cc2..1e3db86436e5b474170c551be477105b5f5d600c 100644 (file)
@@ -719,20 +719,14 @@ gtk_spin_button_init (GtkSpinButton *spin_button)
   gtk_widget_add_events (GTK_WIDGET (spin_button), GDK_SCROLL_MASK);
 
   priv->long_press_gesture = gtk_gesture_long_press_new (GTK_WIDGET (spin_button));
-  gtk_widget_add_controller (GTK_WIDGET (spin_button),
-                             GTK_EVENT_CONTROLLER (priv->long_press_gesture));
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->long_press_gesture),
-                                              GTK_PHASE_NONE);
+  gtk_gesture_attach (priv->long_press_gesture, GTK_PHASE_NONE);
   g_signal_connect (priv->long_press_gesture, "pressed",
                     G_CALLBACK (long_press_action), spin_button);
   g_signal_connect (priv->long_press_gesture, "cancelled",
                     G_CALLBACK (long_press_cancel_action), spin_button);
 
   priv->swipe_gesture = gtk_gesture_swipe_new (GTK_WIDGET (spin_button));
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->swipe_gesture),
-                                              GTK_PHASE_NONE);
-  gtk_widget_add_controller (GTK_WIDGET (spin_button),
-                             GTK_EVENT_CONTROLLER (priv->swipe_gesture));
+  gtk_gesture_attach (priv->swipe_gesture, GTK_PHASE_NONE);
   g_signal_connect (priv->swipe_gesture, "update",
                     G_CALLBACK (swipe_gesture_update), spin_button);
 }
@@ -751,12 +745,10 @@ gtk_spin_button_finalize (GObject *object)
   if (priv->up_panel_context)
     g_object_unref (priv->up_panel_context);
 
-  gtk_widget_remove_controller (GTK_WIDGET (spin_button),
-                                GTK_EVENT_CONTROLLER (priv->long_press_gesture));
+  gtk_gesture_detach (priv->long_press_gesture);
   g_object_unref (priv->long_press_gesture);
 
-  gtk_widget_add_controller (GTK_WIDGET (spin_button),
-                             GTK_EVENT_CONTROLLER (priv->swipe_gesture));
+  gtk_gesture_detach (priv->swipe_gesture);
   g_object_unref (priv->swipe_gesture);
 
   G_OBJECT_CLASS (gtk_spin_button_parent_class)->finalize (object);
index 74bedcada07e8cfd605111560ead7272f2143590..1d24a5c93433b32bbfe4b9a7718731b77f60deb1 100644 (file)
@@ -1841,8 +1841,7 @@ gtk_tree_view_init (GtkTreeView *tree_view)
   gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (tree_view->priv->multipress_gesture), FALSE);
   g_signal_connect (tree_view->priv->multipress_gesture, "pressed",
                     G_CALLBACK (_tree_view_multipress_pressed), tree_view);
-  gtk_widget_add_controller (GTK_WIDGET (tree_view),
-                             GTK_EVENT_CONTROLLER (tree_view->priv->multipress_gesture));
+  gtk_gesture_attach (tree_view->priv->multipress_gesture, GTK_PHASE_BUBBLE);
 }
 
 \f
@@ -2209,8 +2208,7 @@ gtk_tree_view_destroy (GtkWidget *widget)
 
   if (tree_view->priv->multipress_gesture)
     {
-      gtk_widget_remove_controller (GTK_WIDGET (tree_view),
-                                    GTK_EVENT_CONTROLLER (tree_view->priv->multipress_gesture));
+      gtk_gesture_detach (tree_view->priv->multipress_gesture);
       g_clear_object (&tree_view->priv->multipress_gesture);
     }
 
index 6d9c17f7a57f449fdee321e2ea89c1a968f0a041..98569ad8d12c5ad2df52a96d25e6d5018f9b66d2 100644 (file)
@@ -399,6 +399,7 @@ typedef struct {
 
 typedef struct {
   GtkEventController *controller;
+  GtkPropagationPhase phase;
   guint evmask_notify_id;
   guint grab_notify_id;
   guint sequence_state_changed_id;
@@ -4201,7 +4202,6 @@ _gtk_widget_set_sequence_state_internal (GtkWidget             *widget,
 
   for (l = priv->event_controllers; l; l = l->next)
     {
-      GtkPropagationPhase propagation_phase;
       GtkEventSequenceState gesture_state;
       gboolean sequence_handled, retval;
       EventControllerData *data;
@@ -4240,7 +4240,6 @@ _gtk_widget_set_sequence_state_internal (GtkWidget             *widget,
       handled |= retval;
 
       g_signal_handler_unblock (data->controller, data->sequence_state_changed_id);
-      propagation_phase = gtk_event_controller_get_propagation_phase (data->controller);
 
       /* If the sequence goes denied, check whether this is a controller attached
        * to the capture phase, that additionally handled the button/touch press (ie.
@@ -4248,7 +4247,7 @@ _gtk_widget_set_sequence_state_internal (GtkWidget             *widget,
        * beneath, so the widgets beneath get a coherent stream of events from now on.
        */
       if (retval && sequence_handled &&
-          propagation_phase == GTK_PHASE_CAPTURE &&
+          data->phase == GTK_PHASE_CAPTURE &&
           state == GTK_EVENT_SEQUENCE_DENIED)
         send_event = TRUE;
     }
@@ -7237,7 +7236,7 @@ _gtk_widget_run_controllers (GtkWidget           *widget,
     {
       data = l->data;
 
-      if (phase == gtk_event_controller_get_propagation_phase (data->controller))
+      if (phase == data->phase)
         handled |= gtk_event_controller_handle_event (data->controller, event);
     }
 
@@ -11729,7 +11728,7 @@ gtk_widget_dispose (GObject *object)
   while (priv->event_controllers)
     {
       EventControllerData *data = priv->event_controllers->data;
-      gtk_widget_remove_controller (widget, data->controller);
+      _gtk_widget_remove_controller (widget, data->controller);
     }
 
   G_OBJECT_CLASS (gtk_widget_parent_class)->dispose (object);
@@ -16619,7 +16618,6 @@ event_controller_grab_notify (GtkWidget           *widget,
                               EventControllerData *data)
 {
   GtkWidget *grab_widget, *toplevel;
-  GtkPropagationPhase phase;
   GtkWindowGroup *group;
   GdkDevice *device;
 
@@ -16643,12 +16641,10 @@ event_controller_grab_notify (GtkWidget           *widget,
   if (!grab_widget || grab_widget == widget)
     return;
 
-  phase = gtk_event_controller_get_propagation_phase (data->controller);
-
-  if (((phase == GTK_PHASE_NONE ||
-        phase == GTK_PHASE_BUBBLE) &&
+  if (((data->phase == GTK_PHASE_NONE ||
+        data->phase == GTK_PHASE_BUBBLE) &&
        !gtk_widget_is_ancestor (widget, grab_widget)) ||
-      (phase == GTK_PHASE_CAPTURE &&
+      (data->phase == GTK_PHASE_CAPTURE &&
        !gtk_widget_is_ancestor (widget, grab_widget) &&
        !gtk_widget_is_ancestor (grab_widget, widget)))
     {
@@ -16738,23 +16734,10 @@ _gtk_widget_has_controller (GtkWidget          *widget,
   return NULL;
 }
 
-/**
- * gtk_widget_add_controller:
- * @widget: a #GtkWidget, must be the same than the one passed on construction to @controller
- * @controller: a #GtkEventController
- *
- * Adds @controller to the list of controllers that are triggered
- * any time @widget receives events. the stage at which the events
- * are delivered to @controller is mandated by
- * gtk_event_controller_get_propagation_phase(). @widget will also take care
- * of calling gtk_event_controller_reset() whenever input is grabbed
- * elsewhere.
- *
- * Since: 3.14
- **/
 void
-gtk_widget_add_controller (GtkWidget          *widget,
-                           GtkEventController *controller)
+_gtk_widget_add_controller (GtkWidget           *widget,
+                            GtkEventController  *controller,
+                            GtkPropagationPhase  phase)
 {
   EventControllerData *data;
   GtkWidgetPrivate *priv;
@@ -16763,11 +16746,20 @@ gtk_widget_add_controller (GtkWidget          *widget,
   g_return_if_fail (GTK_IS_EVENT_CONTROLLER (controller));
   g_return_if_fail (widget == gtk_event_controller_get_widget (controller));
   g_return_if_fail (!_gtk_widget_has_controller (widget, controller));
+  g_return_if_fail (phase >= GTK_PHASE_NONE && phase <= GTK_PHASE_BUBBLE);
 
   priv = widget->priv;
+  data = _gtk_widget_has_controller (widget, controller);
+
+  if (data)
+    {
+      data->phase = phase;
+      return;
+    }
 
   data = g_new0 (EventControllerData, 1);
   data->controller = g_object_ref (controller);
+  data->phase = phase;
   data->evmask_notify_id =
     g_signal_connect (controller, "notify::event-mask",
                       G_CALLBACK (event_controller_notify_event_mask), widget);
@@ -16787,16 +16779,9 @@ gtk_widget_add_controller (GtkWidget          *widget,
   _gtk_widget_update_evmask (widget);
 }
 
-/**
- * gtk_widget_remove_controller:
- * @widget: a #GtkWidget
- * @controller: a #GtkEventController attached to @widget
- *
- * Removes @controller from the list of controllers managed by @widget.
- **/
 void
-gtk_widget_remove_controller (GtkWidget          *widget,
-                              GtkEventController *controller)
+_gtk_widget_remove_controller (GtkWidget          *widget,
+                               GtkEventController *controller)
 {
   EventControllerData *data;
   GtkWidgetPrivate *priv;
@@ -16821,34 +16806,3 @@ gtk_widget_remove_controller (GtkWidget          *widget,
   g_object_unref (data->controller);
   g_free (data);
 }
-
-/**
- * gtk_widget_list_controllers:
- * @widget: a #GtkWidget
- *
- * Returns the list of controllers that are managed by @widget.
- *
- * Returns: (transfer container) (element-type GtkEventController): the list of
- *   controllers, free with g_list_free()
- *
- * Since: 3.14
- **/
-GList *
-gtk_widget_list_controllers (GtkWidget *widget)
-{
-  EventControllerData *data;
-  GtkWidgetPrivate *priv;
-  GList *l, *retval = NULL;
-
-  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
-
-  priv = widget->priv;
-
-  for (l = priv->event_controllers; l; l = l->next)
-    {
-      data = l->data;
-      retval = g_list_prepend (retval, data->controller);
-    }
-
-  return retval;
-}
index 9a27ee032112d05bc04bac678be2660c43183d74..0ef4f866ca44dd1382a44672ae6a3fde688acc9c 100644 (file)
@@ -1469,14 +1469,6 @@ void    gtk_widget_class_bind_template_child_full       (GtkWidgetClass        *
                                                         const gchar           *name,
                                                         gboolean               internal_child,
                                                         gssize                 struct_offset);
-GDK_AVAILABLE_IN_3_14
-void    gtk_widget_add_controller                       (GtkWidget           *widget,
-                                                         GtkEventController  *controller);
-GDK_AVAILABLE_IN_3_14
-void    gtk_widget_remove_controller                    (GtkWidget           *widget,
-                                                         GtkEventController  *controller);
-GDK_AVAILABLE_IN_3_14
-GList * gtk_widget_list_controllers                     (GtkWidget           *widget);
 
 G_END_DECLS
 
index 6e8bb477d45d3ffcf8313b8aaa92c42ee90d25ec..37081462829b3363d759ae0f3df70263284ff1a6 100644 (file)
@@ -152,6 +152,12 @@ gchar **          _gtk_widget_list_action_prefixes         (GtkWidget    *widget
 GActionGroup *    _gtk_widget_get_action_group             (GtkWidget    *widget,
                                                             const gchar  *prefix);
 
+void              _gtk_widget_add_controller               (GtkWidget           *widget,
+                                                            GtkEventController  *controller,
+                                                            GtkPropagationPhase  phase);
+void              _gtk_widget_remove_controller            (GtkWidget           *widget,
+                                                            GtkEventController  *controller);
+
 G_END_DECLS
 
 #endif /* __GTK_WIDGET_PRIVATE_H__ */
index 1db338d24626239d5e2f5e169a6007dd4fb95bb1..0ffa3fe8a909749caf3e962774501f909598efb9 100644 (file)
@@ -1572,15 +1572,12 @@ gtk_window_init (GtkWindow *window)
   priv->scale = gtk_widget_get_scale_factor (widget);
 
   priv->multipress_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (window));
-  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->multipress_gesture),
-                                              GTK_PHASE_CAPTURE);
   gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (priv->multipress_gesture), FALSE);
   g_signal_connect (priv->multipress_gesture, "pressed",
                     G_CALLBACK (multipress_gesture_pressed_cb), window);
   g_signal_connect (priv->multipress_gesture, "stopped",
                     G_CALLBACK (multipress_gesture_stopped_cb), window);
-  gtk_widget_add_controller (GTK_WIDGET (window),
-                             GTK_EVENT_CONTROLLER (priv->multipress_gesture));
+  gtk_gesture_attach (priv->multipress_gesture, GTK_PHASE_CAPTURE);
 }
 
 static void
@@ -5463,11 +5460,9 @@ gtk_window_finalize (GObject *object)
       priv->mnemonics_display_timeout_id = 0;
     }
 
-  gtk_widget_remove_controller (GTK_WIDGET (window),
-                                GTK_EVENT_CONTROLLER (priv->multipress_gesture));
+  gtk_gesture_detach (priv->multipress_gesture);
   g_object_unref (priv->multipress_gesture);
 
-
   G_OBJECT_CLASS (gtk_window_parent_class)->finalize (object);
 }